#include "usart.h"
#include "JQueue.h"
#include "Uart_thread.h"
#include "user_usart.h"
#include "malloc.h"
uint8_t usart1_tx_flag=0;
extern Mallco_dev mallco_dev;         //内存管理器
JQueue_t  usart_rx_mq;         //lora发送消息队列
#define   usart_rx_mq_size 5
uint8_t   usart_rx_buf[sizeof(SerialData)*usart_rx_mq_size]={0};

JQueue_t  usart_tx_mq;         //lora发送消息队列
#define   usart_tx_mq_size 5
uint8_t   usart_tx_buf[sizeof(SerialData)*usart_tx_mq_size]={0};

#define USART_BUF_SIZE       20
uint8_t USART_BUF[USART_BUF_SIZE]; //串口缓存

/**
  * @brief  USART发送回调执行函数
  * @param  无
  * @retval 无
  */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
	usart1_tx_flag=0;
}
/**
  * @brief  USART接收回调执行函数
  * @param  无
  * @retval 无
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	
}
/// @brief 空闲中断回调
/// @param huart 
void HAL_UART_IdleFrameDetectCpltCallback(UART_HandleTypeDef *huart)
{
	Q_ERR err;
	SerialData serial_data;
	uint8_t len=USART_BUF_SIZE-huart->RxXferCount;
	if(len>0)
	{
		serial_data.data=(uint8_t *)mymalloc(&mallco_dev,len);
		if(serial_data.data)
		{
			mymemcpy(serial_data.data,USART_BUF,len);
			serial_data.len=len;
			J_Enqueue(&usart_rx_mq,&serial_data,&err);
			if(err!=Q_ERR_None)
			{
				myfree(&mallco_dev,serial_data.data);
			}
	  }
  }
	HAL_UART_AbortReceive_IT(huart);
	HAL_UART_Receive_IT(huart, (uint8_t *)USART_BUF, USART_BUF_SIZE);
	__HAL_UART_ENABLE_IT(huart,UART_IT_IDLE);
}

/// @brief 串口一发送数据
/// @param buf 数据
/// @param len 长度
void UART1Send_Data(uint8_t *buf,uint8_t len)
{
	Q_ERR err;
	SerialData serial_data;
	serial_data.data=(uint8_t *)mymalloc(&mallco_dev,len);
	if(serial_data.data)
	{
		mymemcpy(serial_data.data,buf,len);
		serial_data.len=len;
		J_Enqueue(&usart_tx_mq,&serial_data,&err);
		if(err!=Q_ERR_None)
		{
			myfree(&mallco_dev,serial_data.data);
		}
	}
}
/// @brief 串口初始化
void USART_Init()
{
	Q_ERR err;
	J_Create_Queue(&usart_rx_mq,usart_rx_mq_size,usart_rx_buf,sizeof(SerialData),JQ_NO_LOCK_FIFO_QUEUE,&err);   //创建队列
	J_Create_Queue(&usart_tx_mq,usart_tx_mq_size,usart_tx_buf,sizeof(SerialData),JQ_NO_LOCK_FIFO_QUEUE,&err);   //创建队列
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
	HAL_UART_Receive_IT(&huart1, (uint8_t *)USART_BUF, USART_BUF_SIZE);    //使能接收
}
/// @brief 串口运行
/// @param ms 
void USART_Loop(uint8_t ms)
{
	Q_ERR err;
	SerialData usart_data;
	J_Dequeue(&usart_rx_mq,&usart_data,&err);
	if(err==Q_ERR_None)
	{
		Config_RxCallback(usart_data.data,usart_data.len);
		myfree(&mallco_dev,usart_data.data);
	}
	if(usart1_tx_flag)
	{
		return;
	}
	J_Dequeue(&usart_tx_mq,&usart_data,&err);
	if(err==Q_ERR_None)
	{
		usart1_tx_flag=1;
		HAL_UART_Transmit_IT(&huart1, usart_data.data,usart_data.len);
    myfree(&mallco_dev,usart_data.data);
	}
}
